#include "bsp.h"
#include "main.h"                  
#include "multi_task.h"

#define UART_FIFO_COMx   UART_FIFO_COM5
#define UART_BUFF_SIZE   500

static uint8_t _uart_buff[UART_BUFF_SIZE];

static volatile uint8_t _uart_recv_over_flag = 0;

/***************************************************************************************************
 * @fn      test_task_1000ms
 *
 * @brief   1000毫秒执行一次的测试任务
 *
 * @param   arg 任务参数
 *
 * @return  返回0
 */
void test_task_1000ms(void *arg)
{
    uint8_t buf[] = "test UART_FIFO_COMx send buffer";

    uart_fifo_send(UART_FIFO_COMx, buf, sizeof(buf));
}

/***************************************************************************************************
 * @fn      uart_send_befor_cb
 *
 * @brief   串口发送之前执行的函数
 *
 * @param   arg 参数
 *
 * @return  无
 */
void uart_send_befor_cb(void *arg)
{
    /* 打印提示开始发送数据 */
    BSP_LOG("uart fifo start send data: \r\n");
}

/***************************************************************************************************
 * @fn      uart_send_ing_cb
 *
 * @brief   串口每发送一个字节数据执行的函数
 *
 * @param   arg 参数
 *
 * @return  无
 */
void uart_send_ing_cb(void *arg)
{
    uint8_t *data = (uint8_t *)arg;  

    /* 每发送一个字节，LOG输出一个字节数据 */
    BSP_LOG("%c", *data);
}

/***************************************************************************************************
 * @fn      uart_send_over_cb
 *
 * @brief   串口发送完成回调函数
 *
 * @param   arg 参数
 *
 * @return  无
 */
void uart_send_over_cb(void *arg)
{
    /* LOG输出提示，串口发送完成 */
    BSP_LOG("\r\n uart fifo send over\r\n");
}

/***************************************************************************************************
 * @fn      uart_recv_idle_cb
 *
 * @brief   串口空闲回调函数
 *
 * @param   arg 参数
 *
 * @return  无
 */
void uart_recv_idle_cb(void *arg)
{
    /* LOG输出提示，串口空闲 */
    BSP_LOG("\r\n uart idle\r\n");

    _uart_recv_over_flag = 1;
}

/***************************************************************************************************
 * @fn      uart_recv_ing_cb
 *
 * @brief   串口每接收一个数据执行的函数
 *
 * @param   arg 参数
 *
 * @return  无
 */
void uart_recv_ing_cb(void *arg)
{
    uint8_t *data = (uint8_t *)arg;  

    /* 每接收一个字节，LOG输出一个字节数据 */
    BSP_LOG("%c", *data);
}

/***************************************************************************************************
 * @fn      main
 *
 * @brief   主函数
 *
 * @param   无
 *
 * @return  返回0
 */
int main(void)
{
    int32_t recv_len;

    /* 硬件初始化 */
    bsp_init();
    
    /* 初始化 */
    uart_fifo_init(UART_FIFO_COMx, 115200);
    
    /* 设置波特率(用于测试，可在程序运行过程中，软件调节波特率) */
    uart_fifo_set_baud(UART_FIFO_COMx, 115200);

    /* 注册串口发送回调函数 */
    uart_fifo_reg_send_cb(UART_FIFO_COMx, 
                          uart_send_befor_cb, 
                          uart_send_ing_cb,
                          uart_send_over_cb);

    /* 注册串口接收回调函数 */
    uart_fifo_reg_recv_cb(UART_FIFO_COMx, 
                          uart_recv_idle_cb,
                          uart_recv_ing_cb);
    
    /* 初始化多任务 */
    init_multi_task();
    
    while (1)
    {
        bsp_idle();  /* MCU空闲时执行的函数 */

        /* 有一帧数据接收完毕 */
        if (_uart_recv_over_flag)
        {
            _uart_recv_over_flag = 0;

            /* 获取已经收到的数据个数 */
            recv_len = uart_fifo_get_recv_len(UART_FIFO_COMx);

            /* 把所有数据都读出来 */
            if (recv_len <= UART_BUFF_SIZE)
            {
                uart_fifo_recv(UART_FIFO_COMx, _uart_buff, recv_len);
            }
            else
            {
                uart_fifo_recv(UART_FIFO_COMx, _uart_buff, recv_len);
                uart_fifo_clear_recv(UART_FIFO_COMx);
            }

            BSP_LOG("MAIN -> uart fifo recv: %s\r\n", _uart_buff);
        }
        
        task_fast_slice();  /* 快速切换任务 */
        
        task_exec();  /* 执行多任务 */
        
        uart_shell_process();  /* 处理shell接收的数据 */
    }
}


